#ifndef KOMUNIKATOR_H
#define KOMUNIKATOR_H

#include"definicje.h"
#include<stdbool.h>
#include<stdint.h>
#include<sys/types.h>
#include<sys/socket.h>

struct komunikator
{
   struct sockaddr_storage *adres;
   int gniazdo;
};

struct komunikatorIPv6
{
   struct sockaddr_storage *adres;
   int gniazdo;
};

int usunKomunikator(struct komunikator *k);
int usunKomunikatorIPv6(struct komunikatorIPv6 *k);

int dodajKomunikator(struct komunikator *nowy);
int dodajKomunikatorIPv6(struct komunikatorIPv6 *nowy);

int oczekujNaKomunikaty(struct komunikator ***k,struct komunikatorIPv6 ***kIPv6,unsigned int *ilosc,unsigned int *iloscIPv6);

int przyjmijKomunikat(
      struct komunikator *k,
      struct sockaddr_storage **adres,
      int8_t **bufor,
      uint8_t * klucz,
      bool szyfrowane
      );
int przyjmijKomunikatIPv6(
      struct komunikatorIPv6 *k,
      struct sockaddr_storage **adres,
      int8_t **bufor,
      uint8_t * klucz,
      bool szyfrowane
      );

int znajdzKomunikator(struct sockaddr_storage *adres,struct komunikator **kom);
int znajdzKomunikatorIPv6(struct sockaddr_storage *adres,struct komunikatorIPv6 **kom);

int wyslijKomunikat(struct komunikator *kom, struct sockaddr_storage *adres,int8_t *bufor, uint8_t * klucz, bool szyfrowane);
int wyslijKomunikatIPv6(struct komunikatorIPv6 *kom, struct sockaddr_storage *adres,int8_t *bufor, uint8_t * klucz, bool szyfrowane);

#ifdef DEBUG
   void wypiszKomunikatory(void);
#endif

//struct komunikator nowykomunikator(void);
//void usunkomunikator(struct komunikator*)
//int kdodajkomunikator(struct komunikator);
//int kusunkomunikator(


/*
 * 1. Serwer otwiera gniazdo nasluchujace.
 * 2. Serwer tworzy nowy komunikator na danym gnieździe. Oznacza go jako
 * komunikator zewnętrzny. Komunikator jest dodawany do listy przy tworzeniu.
 * 2. Serwer nasłuchuje na komunikatorach.
 * 3. Mamy zbiór G gniazd. Serwer czeka aż stan któregoś gniazda się zmieni,
 * zbiór Z to zbiór gniazd o zmienionym stanie. Przed nasłuchiwaniem jest on
 * pusty, po wyjściu z procedury nasłuchującej zawiera gniazda na których
 * znajdują się oczekujące dane
 * 4. Dla każego gniazda w Z serwer wywołuje metodę pobierzwyślij.
 * Metoda ta pobiera komunikat z podanego gniazda,
 * sprawdza adres zrodlowy komunikatu i przesyla komunikat
 * do okreslonego komunikatora. Jeśli adres komunikatu nie znajduje
 * się na liście to tworzony jest nowy watek, nowe gniazdo,
 * wątek dostaje gniazdo i przesyłany jest odpowiedni komunikat
 * już do nowego wątku
 *
 */

/*
 * Z punktu widzenia wątku nasłuchuje on na gnieździe. Jeżeli coś przyjdzie, to
 * traktuje on obiekt jako liczbę wskazującą na dane pakietu.
 * Jeśli chce on coś wysłać tworzy nowy obiekt w pamięci z danymi pakietu
 * i wysyła adres na jego gniazdo.
 */













#endif
